home *** CD-ROM | disk | FTP | other *** search
/ Day Cry / Day Cry CD.bin / oh_towns / taropyon / splib / splib.lzh / PRG / LHX / DOSIO.C < prev    next >
C/C++ Source or Header  |  1992-12-08  |  2KB  |  85 lines

  1. /***********************************************************
  2.         dosio.c -- MS-DOS dependent I/O
  3. ***********************************************************/
  4. #include    "lh386.h"
  5.  
  6. #include    <stdio.h>
  7. #include    <string.h>
  8. #include    <stdlib.h>
  9. #include    <ctype.h>
  10. #include    <dos.h>
  11. #include    "lh.h"
  12.  
  13. #ifdef    __HIGHC__
  14. #    pragma    On(Align_labels);
  15. #endif
  16.  
  17. time_t        getfiletime(FILE * f)
  18. {
  19.     union stamp stamp;
  20. #ifdef    __HIGHC__
  21.     unsigned int dt, tm;
  22.     _dos_getftime(fileno(f), &dt, &tm);
  23.     stamp.t.date = dt;
  24.     stamp.t.time = tm;
  25. #else
  26.  
  27.     _dos_getftime(fileno(f), (unsigned short *) &(stamp.t.date),
  28.                   (unsigned short *) &(stamp.t.time));
  29. #endif
  30.     return dos2unix(&stamp.s);
  31. }
  32.  
  33. int         setfiletime(FILE * f, time_t utc)
  34. {
  35.     union stamp *stamp;
  36.  
  37.     stamp = (union stamp *) unix2dos(utc);
  38.     fflush(f);
  39.     return _dos_setftime(fileno(f), stamp->t.date, stamp->t.time);
  40. }
  41.  
  42. static char physicaldrive(char *filename)
  43. {
  44. #if     0
  45.     union REGS    regs;
  46.     char        physical[80];
  47.  
  48.     strcpy(physical, filename);
  49.     regs.x.si = (unsigned) filename;
  50.     regs.x.di = (unsigned) physical;
  51.     regs.h.ah = 0x60;
  52.     intdos(®s, ®s);
  53.  
  54.     fprintf(stderr, " = '%c'\n", *physical);
  55.  
  56.     return *physical - 'A' + 1;
  57. #else
  58.     if            (filename[1] == ':')
  59.     {
  60.         return toupper(filename[0]) - 'A' + 1;
  61.     } else
  62.     {
  63.         unsigned    drv;
  64.         _dos_getdrive(&drv);
  65.         return ((char) drv);
  66.     }
  67. #endif
  68. }
  69.  
  70. long        diskspace(char *filename)
  71. {
  72.     struct diskfree_t dtable;
  73.     struct find_t srchbuf;
  74.     long        cluster, freespace;
  75.  
  76.     if (_dos_findfirst(filename, 0x07, &srchbuf))
  77.         srchbuf.size = 0;
  78.     _dos_getdiskfree(physicaldrive(filename), &dtable);
  79.     cluster = (long) dtable.bytes_per_sector * (long) dtable.sectors_per_cluster;
  80.     freespace = (long) dtable.avail_clusters * cluster;
  81.     freespace += (srchbuf.size + cluster - 1) / cluster * cluster;
  82.  
  83.     return freespace;
  84. }
  85.